# -*- coding: utf-8 -*-
# @Author: felix


"""
专门用来 用例Excel参数化

读取Yaml文件
导入yaml 包   : pip install pyyaml

"""
import datetime
import os.path,uuid
import allure

import yaml
from PytestApi.apirun_v7.core.globalContext import g_context
from PytestApi.apirun_v7.utils.logRecord import Logger

current_date = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
log_filename = f'logdata_{current_date}.log'

print("日志文件",log_filename)


log_record = Logger('ExcelCaseParse_logger', log_filename)

class excel_Op:

    # def __init__(self):
    #     # 调用全局变量方法
    #     self.load_context_from_yaml("../example/")

    def read_yaml(self,filePath):
        log_record.logger.info("读取yaml文件")
        caseInfos = []
        with open(filePath, 'r', encoding='utf-8') as f:
            # 加载所有的数据
            caseinfo = yaml.full_load(f)
            caseInfos.append(caseinfo)   # 列表嵌套字典的数据 [{yaml里面的数据}]
            return caseInfos


    def load_context_from_yaml(self,folder_path):
        """

        :param folder_path:  文件路径
        :return:
        """
        try:
                yaml_file_path = os.path.join(folder_path, 'context.yaml')  # 会将 路径 和文件进行拼接
                with open(yaml_file_path, 'r', encoding='utf-8') as f:
                    data = yaml.full_load(f)
                    log_record.logger.info("装载全局变量context_yaml文件数据内容:", data)

                    if data:
                        # data 数据不为空的情况下，将数据写入全局变量中
                        g_context().set_by_dict(data)



        except Exception as e:
                print(f"装载yaml文件错误:{str(e)}")


    def load_excel_files(self,config_path):
        """

        返回满足条件的yaml文件
        :param config_path: Yaml文件存在的路径
        :return: yaml_caseInfos
        """

        # current_path = os.getcwd()  # os.getcwd() 返回的是当前工作目录，而不是文件所在的目录

        """
        # 这里 __file__ 是当前执行文件（在这个例子中就是 A 文件）的路径，
        通过 os.path.abspath 将其转换为绝对路径，再使用 os.path.dirname 获取其所在的目录路径。
        这样无论从哪个文件调用 A 文件，都能正确地获取到 A 文件所在的目录。
        """
        current_path = os.path.dirname(os.path.abspath(__file__))
        log_record.logger.info(f"当前路径:{current_path}")
        parent_path = os.path.dirname(current_path)
        # parent_path = r'D:\HCTest\pythonProject\Request\PytestApi\apirun_v7'
        log_record.logger.info(f"当前路径父级:{parent_path}",)


        yaml_caseInfos = [] # 存储所有的数据

        suite_folder = parent_path + config_path

        log_record.logger.info(f"Yaml_case路径:{suite_folder}")

        # TODO 1 调用全局变量方法,将变量写入全局
        self.load_context_from_yaml(suite_folder)

        # TODO 2 扫描文件夹下的符合用例的yaml文件，
        file_names = [(int(f.split("_")[0]), f) for f in os.listdir(suite_folder) if
                      f.endswith(".yaml") and f.split("_")[0].isdigit()]

        log_record.logger.info(f"测试用例文件:{file_names}")

        # TODO 3 排序之后只保留文件名
        file_names.sort()
        file_names = [f[-1] for f in file_names]
        log_record.logger.info(f"排序后的测试用例文件:{file_names}")

        # TODO 4 遍历文件名并且加入到yaml_caseInfos文件中
        for file_name in file_names:
            file_path = os.path.join(suite_folder, file_name)
            with open(file_path, 'r', encoding='utf-8') as f:
                caseinfo = yaml.full_load(f)
                yaml_caseInfos.append(caseinfo)

        log_record.logger.info(f"获取Yaml测试用例信息:{yaml_caseInfos}")
        return yaml_caseInfos


    def excel_case_parser(self,config_path):

        """
        返回指定条件的格式

        :param config_path: 文件路径
        :return:
            return {
                    "case_infos": case_infos, # 所有的测试用例[]
                "case_names": case_names  # 所有测试用例对应的标题[]
            }
        """

        # TODO 1 : 对应固定格式

        case_infos = []
        case_names = []

        # TODO 2 : 调用对应的方法，拿到所有的数据
        yaml_caseinfos = self.load_excel_files(config_path)

        # TODO 3 : 统一处理成一样的格式 (后面excel一样的处理)

        for case in yaml_caseinfos:
            case_name = case.get("desc",uuid.uuid4().__str__()) # 没有名字，我们自己生成一个，需要把他写到我们测试用例当中
            case.update({"_case_name": case_name})  # 需要把它写到我们测试用例当中

            case_infos.append(case)    # 所有的测试用例[]
            case_names.append(case_name)  # 所有测试用例对应的标题[]

        log_record.logger.info(f"获取Yaml测试用例信息:{case_infos}")
        log_record.logger.info(f"获取Yaml测试用例名称:{case_names}")
        return {
                "case_infos": case_infos, # 所有的测试用例[]
                "case_names": case_names  # 所有测试用例对应的标题[]
            }





if __name__ == '__main__':
    # pass
    yaml_data = excel_Op()
    # current_path = os.getcwd()
    # print(current_path)
    # parent_path = os.path.dirname(current_path)
    # print(parent_path)
    yaml_data.excel_case_parser("\example")
    # current_path =os.path.dirname(os.path.abspath(__file__))
    # log_record.logger.info(f"当前路径:{current_path}")

